有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java SecurityContextHolder尽管成功登录,但仍承载匿名用户

这里的第一个问题,我是spring和spring Security的新手,我目前正在做一个小项目,涉及一个使用ReactJS和spring Boot的简单身份验证系统,我遇到了一个问题,成功登录后,服务器无法提供当前登录的用户,默认为匿名用户,我怀疑在更改实现WebSecurityConfigurerAdapter接口的类的配置时,我在不知不觉中犯了一个错误,因为在我进行这些更改之前,它就已经工作了。除此之外,我在这一点上一无所知

所以一个回顾,注册就像一个符咒,登录工作,并执行一个方法,表明它是成功的,但似乎不能保存会话

这是我的config类中实现WebSecurityConfigurerAdapter接口的configure方法:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().disable().csrf().disable();

    http.authorizeRequests()
    .antMatchers("/resources/**" , "/register")
    .permitAll()
    .anyRequest().authenticated()
    .and().formLogin()
    .failureHandler(handleFailure())
    .successHandler(handleSuccess()) 
    .permitAll()
    .and()
    .cors();
}

这是用来返回我想要获取的值的代码

@GetMapping(path="/userdetails")
public ResponseEntity<Object> getUserDetails(){
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    return createResponse(auth.getPrincipal(),HttpStatus.OK);
}

我很乐意提供更多的代码示例,因为我不想在这里粘贴太多代码,因为坦率地说,我不知道问题的根源在哪里

编辑: 这是我用来发送登录表单的jquery方法

$.post(`${__SERVER}/login` , $("#login-form").serialize())

我是不是误解了什么?文档中说,发送登录表单的默认端点是/login(如果未指定)

这是用于注册的url字符串:

http://localhost:8080/register?username=example@mail.com&password=asdfasdf&passwordConfirm=asdfasdf

这是用于登录表单的

http://localhost:8080/login?username=example@mail.com&password=asdfasdf

在服务器中调试它们表明,它们确实到达了,并且被整齐地包装在各自的对象中,但不知怎的,它就是不起作用

截图:

Response headers after a supposed successful login

Headers after requesting for the currently authenticated user.

Cookies

更新: 显然,一些用户在使用microsoft edge时遇到了与我类似的问题:set-cookie header not setting cookie in Edge

所以我安装了其他浏览器只是为了检查,不幸的是,没有一个浏览器能够解决这个问题

我决定玩一些我在网上找到的教程,我偶然发现了这个:https://hellokoding.com/spring-boot/security-login-mysql-jsp/

创建了教程回购协议的副本,然后进行了增量更改,引起我注意(并最终解决了这个问题)的是以下代码

spring.mvc.view.prefix = /

在我的应用程序属性中找到,我将其插入到我的属性文件中,它成功了!,什么

有人能解释一下这种改变是如何以及为什么起作用的吗

整个模型在这一点上似乎如此混乱,任何澄清将不胜感激


共 (0) 个答案